// 166.分数到小数
package Leetcode_Second_Brush;

import java.util.HashMap;
import java.util.Map;

public class Solution166 {
    public String fractionToDecimal(int numerator, int denominator) {
        // 剪枝，如果被除数是0
        if (numerator == 0) {
            return "0";
        }

        StringBuilder result = new StringBuilder();

        // 如果当前的结果是负数，则添加负号
        if ((numerator < 0) ^ (denominator < 0)) {
            result.append("-");
        }

        // 将除数和被除数变为正数来处理，并转换数据类型为long，否则出现 1/Intger.MAX_VALUE 的情况无法处理
        long num = Math.abs((long) numerator);
        long denom = Math.abs((long) denominator);

        // 添加整数部分
        result.append(num / denom);
        num %= denom;

        // 如果余数为0表示没有小数部分，直接返回
        if (num == 0) {
            return result.toString();
        }

        // 开始计算小数部分
        result.append(".");

        // 使用map记录当前的除数以及对应位置的下标
        Map<Long, Integer> remainderMap = new HashMap<>();
        while (num != 0) {
            // 如果出现循环，则再对应的位置插入括号
            if (remainderMap.containsKey(num)) {
                int index = remainderMap.get(num);
                result.insert(index, "(");
                result.append(")");
                break;
            }

            // 将当前值加入到map中
            remainderMap.put(num, result.length());

            // 计算小数部分并加入result中
            num *= 10;
            result.append(num / denom);
            num %= denom;
        }

        return result.toString();
    }
}
